7.9 分组进阶应用之分组排名
在对数据完成分组后,可以执行不同的数据处理,比如前面的聚合、转换、过滤就是常见的分组处理方式,不同的处理方式可能会使用不同的处理函数,函数apply,可以遍历Series中的每个元素,也可以遍历DataFrame表格中每行或每列数据,在分组下遍历的是每个分组的DataFrame子表。
import pandas as pd
df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.09 分组进阶应用之分组排名.xlsx" )
print (df)
df[ "总排名" ]=(df.数学+df.语文).rank(ascending=True)
print (df)
t=df.groupby( "班级" ).apply(lambda d:(d.数学+d.语文).rank(ascending=True))
# 把df[ "总排名"]完成放下来,d:表示子表,子表后面的df改成d
print (t)
df=df.assign(分组排名=1)
print (df)
t2=df.groupby( "班级" ).apply( lambda d:d.assign(分组排名=(d.数学+d.语文).rank( ascending = True )))
# 把df.assign(分组排名=放入后面的d
print (t2)
返回df原表:
班级 | 姓名 | 语文 | 数学 | |
---|---|---|---|---|
0 | 1班 | 张三 | 90 | 83 |
1 | 1班 | 李四 | 100 | 87 |
2 | 1班 | 王五 | 95 | 88 |
3 | 2班 | 郭流子 | 81 | 97 |
4 | 2班 | 许麻子 | 92 | 89 |
5 | 3班 | 宋狗子 | 89 | 88 |
6 | 3班 | 小曾 | 84 | 84 |
7 | 3班 | 韦大宝 | 87 | 94 |
返回df(总排名):
班级 | 姓名 | 语文 | 数学 | 总排名 | |
0 | 1班 | 张三 | 90 | 83 | 2.0 |
1 | 1班 | 李四 | 100 | 87 | 8.0 |
2 | 1班 | 王五 | 95 | 88 | 7.0 |
3 | 2班 | 郭流子 | 81 | 97 | 4.0 |
4 | 2班 | 许麻子 | 92 | 89 | 5.5 |
5 | 3班 | 宋狗子 | 89 | 88 | 3.0 |
6 | 3班 | 小曾 | 84 | 84 | 1.0 |
7 | 3班 | 韦大宝 | 87 | 94 | 5.5 |
返回t1:
班级 | ||
---|---|---|
1班 | 0 | 1.0 |
1 | 3.0 | |
2 | 2.0 | |
2班 | 3 | 1.0 |
4 | 2.0 | |
3班 | 5 | 2.0 |
6 | 1.0 | |
7 | 3.0 |
dtype: float64
返回df+t1:
班级 | 姓名 | 语文 | 数学 | 总排名 | 分组排名 | |
---|---|---|---|---|---|---|
0 | 1班 | 张三 | 90 | 83 | 2.0 | 1 |
1 | 1班 | 李四 | 100 | 87 | 8.0 | 1 |
2 | 1班 | 王五 | 95 | 88 | 7.0 | 1 |
3 | 2班 | 郭流子 | 81 | 97 | 4.0 | 1 |
4 | 2班 | 许麻子 | 92 | 89 | 5.5 | 1 |
5 | 3班 | 宋狗子 | 89 | 88 | 3.0 | 1 |
6 | 3班 | 小曾 | 84 | 84 | 1.0 | 1 |
7 | 3班 | 韦大宝 | 87 | 94 | 5.5 | 1 |
返回df+t2:
班级 | 姓名 | 语文 | 数学 | 总排名 | 分组排名 | ||
---|---|---|---|---|---|---|---|
班级 | |||||||
1班 | 0 | 1班 | 张三 | 90 | 83 | 2.0 | 1.0 |
1 | 1班 | 李四 | 100 | 87 | 8.0 | 3.0 | |
2 | 1班 | 王五 | 95 | 88 | 7.0 | 2.0 | |
2班 | 3 | 2班 | 郭流子 | 81 | 97 | 4.0 | 1.0 |
4 | 2班 | 许麻子 | 92 | 89 | 5.5 | 2.0 | |
3班 | 5 | 3班 | 宋狗子 | 89 | 88 | 3.0 | 2.0 |
6 | 3班 | 小曾 | 84 | 84 | 1.0 | 1.0 | |
7 | 3班 | 韦大宝 | 87 | 94 | 5.5 | 3.0 |